var connect = require('connect');
var bodyParser = require('body-parser');
var database = require('./database');
var utils = require('./utils');
var redis = require('redis');
var multipart = require('connect-multiparty');
var path = require('path');
var parseUrl = require('url').parse;

// 用来解析request中body的urlencoded字符。
// 当extended为false的时候，键值对中的值就为'String'或'Array'形式，为true的时候，则可为任何数据类型。
var postBody = connect();
postBody.use(bodyParser.json());
postBody.use(bodyParser.urlencoded({extended: true}));
postBody.use(multipart());
exports.postBody = postBody;

/**
 * 检查用户是否已登录
 */
exports.ensureLogin = function(req, res, next){
  req.loginUserId = 'bestmian';
  next();
}

/**
 * 中间件：响应请求成功和失败结果
 * @param {Object} req 
 * @param {Object} res 
 * @param {Funtion} next 
 */
exports.extendAPIOutput = function(req, res, next){

  // 输出数据
  function output (data) {

    // 取得请求的数据格式
    var type = path.extname(parseUrl(req.url).pathname);
    if (!type) type = '.' + req.accepts(['json', 'xml']);
    switch (type) {
      case '.xml':
        return res.xml(data);
      default:
        return res.json(data);
    }
  }

  res.apiSuccess = function(data){
    output({
      status: 'OK',
      result: data
    });
  };

  res.apiError = function(err){
    output({
      status: 'Error',
      error_code: err.error_code || 'UNKNOWN',
      error_message: err.error_message || err.toString()
    });
  };

  // 输出XML格式数据
  // res.xml = function (data) {
  //   res.setHeader('content-type', 'text/xml');
  //   res.end(js2xmlparser('data', data));
  // };

  next();
}

/**
 * 生成统一的错误对象
 * @param {Number} code 
 * @param {String} msg 
 */
exports.createApiError = function(code, msg){
  var err = new Error(msg);
  err.error_code = code;
  err.error_message = msg;
  return err;
}

exports.apiErrorHandle = function(err, req, res, next){
  if(typeof res.apiError === 'function'){
    return res.apiError(err);
  }
  next();
}

// 验证AccessToken
exports.verifyAccessToken = function(req, res, next){
  var accessToken = (req.body && req.body.access_token) || req.query.access_token;
  var source = (req.body && req.body.source) || req.query.source;

  // 检查参数
  if (!accessToken) return next(utils.missingParameterError('access_token'));
  if (!source) return next(utils.missingParameterError('source'));

  // 查询access_token的信息
  database.getAccessTokenInfo(accessToken, function(err, tokenInfo){
    if(err) return next(err);

    // 检查appKey是否一致
    if (source !== tokenInfo.clientId) {
      return next(utils.invalidParameterError('source'));
    }

    // 保存当前access_token的详细信息
    req.accessTokenInfo = tokenInfo;

    next();
  });
}

// 连接的redis
var redisClient = redis.createClient();

// 生成检测请求频率的中间件
exports.generateRateLimiter = function(getKey, limit){
  return function(req, res, next){

    var source = (req.body && req.body.source) || req.query.source;
    var key = getKey(source);

    redisClient.incr(key, function(err, ret){
      if (err) return next(err);
      if (ret > limit) return next(utils.outOfRateLimitError());
      next();
    });
  }
}